package vista;

import java.text.DecimalFormat;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.swing.table.AbstractTableModel;

import comun.Util;

import modelo.Prenda;


/**
 * Esta clase representa el modelo de la tabla que se utiliza para agregar productos a una factura.
 *
 */
@SuppressWarnings("serial")
public class PrendasTableModel extends AbstractTableModel  {
    private FacturaPanel facturaPanel;
	private static final int SELECCIONADO = 0;
    private static final int NOMBRE = 1;
    private static final int COSTO = 2;
    private static final int CANTIDAD = 3;
	
    /** lista que contiene los prendas */
	private List<Prenda> prendas;
    
    final static String[] columnNames = {"Seleccionado", "Nombre", "Costo", "Cantidad"};
    
    boolean isEditable = true;

    public PrendasTableModel(List<Prenda> prendas, FacturaPanel facturaPanel) {
        this.prendas = prendas;
        this.facturaPanel = facturaPanel;
    }

    public String getColumnName(int col) {
        return columnNames[col];
    }

   public int getRowCount() {
        return prendas.size();
    }

    public int getColumnCount() {
        return columnNames.length;
    }

    public Object getValueAt(int row, int col) {
        Object result = null;
        Prenda prenda = prendas.get(row);
        switch (col) {
            case SELECCIONADO:
                result = prenda.isSelected();
                break;
            case NOMBRE:
                result = prenda.getNombre();
                break;
            case COSTO:
            	DecimalFormat df = new DecimalFormat();
            	df.setMaximumFractionDigits(2);
                result = df.format(prenda.precioVenta());
                break;
            case CANTIDAD:
                result = prenda.getCantidad();
                break;
        }
        return result;

    }
    
    @SuppressWarnings({ "unchecked", "rawtypes" })
	public Class getColumnClass(int c) {
    	if(c == SELECCIONADO){
    		return Boolean.class;
    	}
    	
        return String.class;
    }
    
    public void setProductos(List<Prenda> prendas) {
		this.prendas = prendas;
		fireTableRowsInserted(prendas.size(), prendas.size());
	}
    
    public boolean isCellEditable(int row, int col) {
    	if(col == CANTIDAD || col == SELECCIONADO){
    		return true;
    	}
        return false;
    }
    
    public void setEditable(boolean isEditable){
        this.isEditable = isEditable;
    }

    public void setValueAt(Object value, int row, int col) {
        Prenda prenda = prendas.get(row);

        switch (col) {
	        case SELECCIONADO:
	        	Boolean selected = (Boolean)value;
	            prenda.setSelected(selected);
	            break;
	        case CANTIDAD:
	        	int cantidad = 0;
	        	try { 
	        		cantidad = Integer.parseInt((String)value); 
	    	        if(cantidad < 0){
	    	        	cantidad = 0;
	    	        }
	    	    } catch(NumberFormatException e) { 
	    	        
	    	    }
	        	if(prenda.puedoVender(cantidad)) {
	        		prenda.setCantidad(cantidad);
	        	}else {
	        		Util.displayErrorMessage(facturaPanel, "El producto no tiene suficiente stock. Stock: "+prenda.getStock());
	        	}
	            
	            break;       
        }
    }
    
    public Map<String, Integer> getPrendasSeleccionadas() {
    	Map<String, Integer> seleccionados = new HashMap<String, Integer>();
    	for(Prenda prenda: prendas) {
    		if(prenda.isSelected()){
    			seleccionados.put(prenda.getCodigo(), prenda.getCantidad());
    		}
    	}
    	return seleccionados;
    }
}
